Selection Problem
Table of Contents
k-th Smallest Element in the Union of Two Sorted Arrays
Median of two sorted arrays
Median of two sorted arrays of different sizes
http://sagarkarnati.wordpress.com/2012/07/07/find-median-of-2-sorted-arrays/ http://leetcode.com/2011/03/median-of-two-sorted-arrays.html http://www.geeksforgeeks.org/median-of-two-sorted-arrays-of-different-sizes/ http://stackoverflow.com/questions/12584648/understanding-the-algorithm-of-median-of-two-sorted-arrays http://blog.unieagle.net/2012/10/04/leetcode%E9%A2%98%E7%9B%AE%EF%BC%9Amedian-of-two-sorted-arrays/ http://ideone.com/FtqjM
Random Selection
算法平均时间复杂度: O(n) 。
unsigned int seed = time(NULL); int randint(int m, int n) { return m + rand_r(&seed) / (RAND_MAX / (n + 1 - m) + 1); } void RandomSelectionK(int *array, int l, int u, int k) { if (l >= u) { return; } swap(array[l], array[randint(l, u)]); int pivot = array[l]; int i = l; int j = u + 1; while (true) { do { ++i; } while (i <= u && array[i] < pivot); do { --j; } while (array[j] > pivot); if (i > j) { break; } swap(array[i], array[j]); } swap(array[l], array[j]); if (j < k) { RandomSelectionK(array, j + 1, u, k); } else if (j > k) { RandomSelectionK(array, l, j - 1, k); } }
BFPRT1
在乱序数组中找寻中间元素,算法复杂度O(n).
算法刊登在Blum et al. (Tarjan)。经常称为BFPRT,以论文作者最后名字这和组合而来。
#include <algorithm> using std::swap; void BubbleSort(int *array, int left, int right) { int bound = right; while (1) { int tmp = 0; for (int i = left; i <= right; ++i) { if (array[i] > array[i + 1]) { swap(array[i], array[i + 1]); tmp = i; } } if (tmp == 0) { break; } bound = tmp; } } int FindMedian(int *array, int left, int right) { const int kGroupSize = 5; int size = right - left + 1; if (size <= kGroupSize) { BubbleSort(array, left, right); return array[(size - 1) / 2 + 1]; } int num_group = (size - kGroupSize + 1) / kGroupSize; for (int i = 0; i < num_group; ++i) { int sub_left = left + kGroupSize * i; int sub_right = sub_left + kGroupSize - 1; if (sub_right > right) { sub_right = right; } BubbleSort(array, sub_left, sub_right); swap(array[left + i], array[(right + left - 1) / 2 + 1]); } return FindMedian(array, left, left + num_group - 1); }
Tournament Algorithm
Find the second-largest element
算法复杂度O(n+logn);
Find the k-largest element
算法复杂度O(n+klogn);